iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
自我挑戰組

C 語言筆記系列 第 14

[C 語言筆記--Day14] pointer, function, array 同時出現在一行宣告時該如何解讀

  • 分享至 

  • xImage
  •  

這篇文章接續上一篇的話題

來紀錄一些更加奇怪的寫法以及如何解讀

最後也會紀錄一下我看過的一個 pointer to function 的例子

大綱

  1. 解讀時的原則
  2. 一些限制
  3. 實際的例子:xv6
  4. 參考資料

1. 解讀時的原則

  • a) 由內而外的解讀
  • b) []() 優先於 *

例一:

int *ap[10];

基於原則 b) 應該解讀成 array of pointers (array 先解讀,再解讀pointer)

而非 pointer of array

例二:

float *fp(float)

function (先解讀(float)) that returns a pointer (再解讀float *)

例三:

float (*fp)(int)

type of fp

  1. pointer to (解讀 (*fp) 因 a) 由內而外)
  2. function with int argument (先解讀 ())
  3. returning float

例四:

int *(*x[10])(void)

type of x

  1. array of
  2. pointers to
  3. functions with no argument
  4. returning pointer to int

2. 一些限制

int f(int)[];           /*** WRONG ***/

不可回傳 function

int g(int)(int);        /*** WRONG ***/

array of funtionis 不成立,
個人的解讀是,array 的每個 element 都要相同大小才行:

int a[10](int);         /*** WRONG ***/

(但 array of function to pointer 是可以的)

3. 實際的例子:xv6

在 xv6-riscv 中的 kernel/syscall.c:108 也用到了這種複雜的宣告:

static uint64 (*syscalls[])(void) = {
[SYS_fork]    sys_fork,
[SYS_exit]    sys_exit,
[SYS_wait]    sys_wait,
[SYS_pipe]    sys_pipe,
[SYS_read]    sys_read,
[SYS_kill]    sys_kill,
[SYS_exec]    sys_exec,
[SYS_fstat]   sys_fstat,
[SYS_chdir]   sys_chdir,
[SYS_dup]     sys_dup,
[SYS_getpid]  sys_getpid,
[SYS_sbrk]    sys_sbrk,
[SYS_sleep]   sys_sleep,
[SYS_uptime]  sys_uptime,
[SYS_open]    sys_open,
[SYS_write]   sys_write,
[SYS_mknod]   sys_mknod,
[SYS_unlink]  sys_unlink,
[SYS_link]    sys_link,
[SYS_mkdir]   sys_mkdir,
[SYS_close]   sys_close,
};

syscalls 應該被解讀成:

  1. array of
  2. pointers to
  3. functions with no arguments
  4. returning uint64

4. 參考資料

C Programming: A Modern Approach, 2/e


上一篇
[C 語言筆記--Day13] Pointers to Functions
下一篇
[C 語言筆記--Day15] 如何清空終端機
系列文
C 語言筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言